package fwmpc.interact;

import fwhmc.rt.function.BodyBuildFunction;
import fwhmc.rt.function.HeadersBuildFunction;
import fwhmc.rt.function.ParameterBuildFunction;
import fwhmc.rt.function.RequestResultFunction;
import fwmpc.exception.WeiXinRuntimeException;
import org.springframework.http.HttpMethod;

import javax.net.ssl.SSLContext;

/**
 * 接口描述:  微信交互处理接口
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2021/1/18 0018 下午 3:09
 */
public interface IWeiXinInteraction {

    /**
     * 功能描述：使用Post提交数据
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws WeiXinRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByPost(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction
            , SSLContext sslContext, RequestResultFunction<T, V> requestResultFunction) throws WeiXinRuntimeException;

    /**
     * 功能描述：使用Get提交数据
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws RuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByGet(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws RuntimeException;

    /**
     * 功能描述：自定义数据体类型Get请求
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws WeiXinRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V userDefinedMediaTypeHttpByGet(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws RuntimeException;

    /**
     * 功能描述：自定义数据体类型Post请求
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws WeiXinRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V userDefinedMediaTypeHttpByPost(String sendUrl, Class<T> requestResultClass
            , HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws WeiXinRuntimeException;

    /**
     * 功能描述：自定义请求
     *
     * @param sendUrl                提交的地址
     * @param httpMethod             请求类型
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param sslContext             CA证书拓展
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws WeiXinRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V userRestTemplateByHttpMethod(String sendUrl, HttpMethod httpMethod
            , Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, SSLContext sslContext
            , RequestResultFunction<T, V> requestResultFunction) throws WeiXinRuntimeException;

    /**
     * 功能描述：使用Post提交数据
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws WeiXinRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByPost(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction
            , RequestResultFunction<T, V> requestResultFunction) throws WeiXinRuntimeException;

    /**
     * 功能描述：使用Get提交数据
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws RuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V httpByGet(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction
            , RequestResultFunction<T, V> requestResultFunction) throws RuntimeException;

    /**
     * 功能描述：自定义数据体类型Get请求
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws WeiXinRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V userDefinedMediaTypeHttpByGet(String sendUrl, Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction
            , BodyBuildFunction bodyBuildFunction, ParameterBuildFunction parameterBuildFunction
            , RequestResultFunction<T, V> requestResultFunction) throws RuntimeException;

    /**
     * 功能描述：自定义数据体类型Post请求
     *
     * @param sendUrl                提交的地址
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws WeiXinRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V userDefinedMediaTypeHttpByPost(String sendUrl, Class<T> requestResultClass
            , HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, RequestResultFunction<T, V> requestResultFunction) throws WeiXinRuntimeException;

    /**
     * 功能描述：自定义请求
     *
     * @param sendUrl                提交的地址
     * @param httpMethod             请求类型
     * @param requestResultClass     获取后转换的数据对象
     * @param headersBuildFunction   Header构建函数
     * @param bodyBuildFunction      Body构建函数
     * @param parameterBuildFunction 参数构建函数
     * @param requestResultFunction  返回结果处理函数
     * @return 返回预定义的数据内容；返回的数据对象类型由requestResultFunction函数返回类型决定
     * @throws WeiXinRuntimeException 自定义运行时异常
     * @author : 王雷
     * @date : 2020/7/15 0015 下午 4:31
     */
    <T, V> V userRestTemplateByHttpMethod(String sendUrl, HttpMethod httpMethod
            , Class<T> requestResultClass, HeadersBuildFunction headersBuildFunction, BodyBuildFunction bodyBuildFunction
            , ParameterBuildFunction parameterBuildFunction, RequestResultFunction<T, V> requestResultFunction) throws WeiXinRuntimeException;
}
